package com.advanced.controller;

import com.advanced.config.redis.RedisLock;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;

/**
 * 开发公司：个人
 * 版权：个人
 * <p>
 * IndexController
 *
 * @author 刘志强
 * @created Create Time: 2019/5/23
 */
@Controller
public class IndexController {
    @Autowired
    public StringRedisTemplate stringRedisTemplate;
    @Autowired
    private RedisLock redisLock;

    private Logger logger = LoggerFactory.getLogger(getClass());

    /**
     * 重定向至首页
     *
     * @param httpServletResponse
     * @throws IOException
     */
    @GetMapping("/")
    public void root(HttpServletResponse httpServletResponse) throws IOException {
        httpServletResponse.sendRedirect("/index");
    }


    @GetMapping("fbs")
    @ResponseBody
    public String fbs() throws InterruptedException {
        boolean bol = redisLock.getLock("a", 10L);
        if (bol) {
            System.out.println("获得锁");
            Thread.sleep(5000L);
            redisLock.unLock("a");
            return "获得锁";
        } else {
            System.out.println("获取锁失败");
            Thread.sleep(1000);
            return fbs();
        }
    }

    /**
     * @param type 0 开启事务 1 放弃事务
     * @return
     */
    @GetMapping("/affair")
    @ResponseBody
    public Map affair(int type) {


        logger.info("=========================================事务 开始======================================");

        /**
         * 开启一个事务
         */
        stringRedisTemplate.multi();
        stringRedisTemplate.opsForValue().set("11", "11");
        stringRedisTemplate.opsForValue().set("22", "22");
        stringRedisTemplate.opsForValue().set("33", "33");
        stringRedisTemplate.opsForValue().get("11");
        stringRedisTemplate.opsForValue().get("22");
        stringRedisTemplate.opsForValue().get("33");
        if (type == 0) {
            /**
             * 执行所有事务块内的命令。
             */
            List<Object> list = stringRedisTemplate.exec();
            list.forEach(o -> logger.info((String) o));
        } else {
            /**
             * 取消事务，放弃执行事务块内的所有命令。如果正在使用 WATCH 命令监视某个(或某些) key，那么取消所有监视，等同于执行命令 UNWATCH 。
             */
        }
        return null;
    }


    @GetMapping("/index")
    @ResponseBody
    public Map index() {

        logger.info("=========================================get,set,del 开始======================================");

        /**
         * 将字符串值 value 关联到 key 存储至redis.如果redis库中有相同的key，key将被覆盖
         * 第一个参数 key
         * 第二个参数 value
         * 等同 SET
         */
        stringRedisTemplate.opsForValue().set("userName", "Liuzhiqiang");


        /**
         * 将值 value 关联到 key ，并设置 key 的生存时间。
         * 第一个参数 key
         * 第二个参数 value
         * 第三个参数 生存时间
         * 第四个参数 生存时间类型
         * 等同 SETEX
         */
        stringRedisTemplate.opsForValue().set("userId", "12", 10, TimeUnit.SECONDS);
        logger.info(String.valueOf(stringRedisTemplate.opsForValue().get("userId")));


        /**
         * 根据key从redis中取出value
         * 第一个参数 key
         * 等同 GET
         */
        logger.info((String) stringRedisTemplate.opsForValue().get("userName"));


        /**
         *  根据key从redis中取出截取后value，value只能是字符串
         *  第一个参数 key
         *  第二个参数开始位置
         *  第三个参数结束位置 -1 为最后一位， -2为倒数第二位，以此类推
         */
        logger.info(stringRedisTemplate.opsForValue().get("userName", 3, -1));


        /**
         *给key重新分配一个value并返回旧值
         * 第一个参数key
         * 第二个参数新的value
         */
        String str = (String) stringRedisTemplate.opsForValue().getAndSet("userName", "wangyan");
        logger.info(str);
        logger.info((String) stringRedisTemplate.opsForValue().get("userName"));


        /**
         * 根据key从redis库中删除
         * 第一个参数 key
         * 等同 DEL
         */
        stringRedisTemplate.delete("userName");
        logger.info((String) stringRedisTemplate.opsForValue().get("userName"));


        List<String> list = new ArrayList<>();
        list.add("userName");
        list.add("userId");
        /**
         * 批量删除
         */
        stringRedisTemplate.delete(list);
        logger.info((String) stringRedisTemplate.opsForValue().get("userName"));
        logger.info((String) stringRedisTemplate.opsForValue().get("userId"));

        logger.info("=========================================get,set,del 结束======================================");
        return null;

    }


}